﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BoaSorte.TO;

namespace BoaSorte.Service
{
    public class MegaSena
    {
        BoaSorteEntities _boaSorte = new BoaSorteEntities();

        public List<Resultado> GetResultado() {

            var listaResultado = (from c in _boaSorte.CONCURSO
                             select new Resultado
                             {
                                 numero = c.NRO_CONCURSO,
                                 dezena1 = c.NRO_DEZENA_1,
                                 dezena2 = c.NRO_DEZENA_2,
                                 dezena3 = c.NRO_DEZENA_3,
                                 dezena4 = c.NRO_DEZENA_4,
                                 dezena5 = c.NRO_DEZENA_5,
                                 dezena6 = c.NRO_DEZENA_6
                             }).ToList();

            return listaResultado;
        }

        public Resultado GetResultadoPorConcurso(decimal nro_concurso)
        {
            Resultado resultado = (from c in _boaSorte.CONCURSO
                                   select new Resultado
                                   {
                                       numero = c.NRO_CONCURSO,
                                       dezena1 = c.NRO_DEZENA_1,
                                       dezena2 = c.NRO_DEZENA_2,
                                       dezena3 = c.NRO_DEZENA_3,
                                       dezena4 = c.NRO_DEZENA_4,
                                       dezena5 = c.NRO_DEZENA_5,
                                       dezena6 = c.NRO_DEZENA_6
                                   }).First();
            return resultado;
        }

        public List<Resultado> GetResultadoSQL()
        {

            var listaPlano = (from c in _boaSorte.CONCURSO
                              select new Resultado
                              {
                                  dezena1 = c.NRO_DEZENA_1
                              }).ToList();

            return listaPlano;

        }



        public void Processar()
        {
            HashSet<decimal> numeros = new HashSet<decimal>();
            for (int num = 1; num < 61; num++)
            {
                bool isNumeroValido = ValidarNumero(num);
                if (isNumeroValido)
                {
                    numeros.Add(num);
                }
            }

            GerarJogoAleatorio(numeros.ToArray(), 6);

        }

        public decimal[] GerarJogoAleatorio(decimal[] numerosValidos, int qtdeNumJogo)
        {
            int qtdeNumerosValidos = numerosValidos.Count();
            ISet<decimal> jogoAleatorio = new SortedSet<decimal>();

            while (jogoAleatorio.Count < qtdeNumJogo)
            {
                int posicao = new Random().Next(0, qtdeNumerosValidos);
                jogoAleatorio.Add(numerosValidos[posicao]);
            }


            ValidarJogo(jogoAleatorio);
            return jogoAleatorio.ToArray();
        }


        public bool ValidarJogo(ISet<decimal> jogo)
        {
            //Se possui mais de duas ocorrencias entre (10,20,30,40,50,60)
            int qtdeDecimais = 0;
            for (int i = 1; i <= 6; i++)
            {
                if (jogo.Contains(i*10))
                {
                    qtdeDecimais++;
                }
            }
            if (qtdeDecimais > 2)
            {
                return false;
            }


            //Se possui uma sequência maior que 3 consecutivos
            decimal[] diferencas = new decimal[jogo.Count-1];
            int qtdeSequencia = 0;
            for (int j = 0; j < jogo.Count-1; j++)
            {
                if (jogo.ElementAt(j + 1) - jogo.ElementAt(j) == 1)
                {
                    qtdeSequencia++;
                }
            }
            if (qtdeSequencia > 3)
            {
                return false;
            }


            return true;
        }

        public bool ValidarNumero(decimal numero)
        {
            var ult3jogos = GetUltimosConcursos(3);
            var ult8jogos = GetUltimosConcursos(8);

            int qtde3UltJogos = GetQtdeJogosNumero(ult3jogos, numero);
            int qtde8UltJogos = GetQtdeJogosNumero(ult8jogos, numero);

            if (qtde3UltJogos < 2 && qtde8UltJogos < 5)
            {
                return true;
            }

            return false;
        }

        public decimal[] GetUltimosConcursos(int qtde)
        {
            var concursos = (from c in _boaSorte.CONCURSO
                             orderby c.NRO_CONCURSO descending 
                             select c.NRO_CONCURSO
                             ).Take(qtde);
            return concursos.ToArray();
        }

        public int GetQtdeJogosNumero(decimal[] concursos, decimal numero)
        {
            int qtde = _boaSorte.CONCURSO.Count(c => concursos.Contains(c.NRO_CONCURSO) &&
                                               (c.NRO_DEZENA_1 == numero || c.NRO_DEZENA_2 == numero || c.NRO_DEZENA_3 == numero ||
                                                c.NRO_DEZENA_4 == numero || c.NRO_DEZENA_5 == numero || c.NRO_DEZENA_6 == numero ));

            return qtde;
        }

    }
}
